#!/usr/bin/env python3
import gi, subprocess, os
gi.require_version('Gtk', '3.0')
from kutuphaneler import diller, klavyeler, hosgeldiniz, klavye, konum, kullanici, disk, bilgi, kurulum, bitti, disk_secim
#gi.require_version('GtkSource', '3.0')

from gi.repository import Gtk, GdkPixbuf


class MerkezPencere(Gtk.Window):
	def __init__(self):
		Gtk.Window.__init__(self)
		self.set_border_width(5)
		self.set_resizable(False)
		self.set_default_size(640, 350)
		self.set_position(Gtk.WindowPosition.CENTER)
		self.disk_silindi = False
		self.milis_ayarlari = {"dil":"Türkçe",
					"klavye_model":"pc105",
					"klavye_duzen":"tr",
					"klavye_varyant":"",
					"konum":False,
					"kullanici_adi":"",
					"giris_adi":"",
					"bilgisayar_adi":"",
					"kullanici_sifre":"",
					"yonetici_sifre":"",
					"oto_giris":False,
					"sistem_disk":"",
					"takas_disk":"",
					"uefi_disk":"",
					"grub_kur":True,
					"gruplar":""}
		self.canli_kullanici = self.canli_kullanici_getir()
		gruplar_komut = subprocess.check_output(["groups",self.canli_kullanici], timeout=2)
		gruplar = gruplar_komut.decode("UTF-8").rstrip()
		gruplar = gruplar.replace("{} : {} ".format(self.canli_kullanici,self.canli_kullanici),"").replace(" ",",")
		self.milis_ayarlari['gruplar'] = gruplar
		self.resim_yol = "./resimler/"
		if os.path.exists("/usr/share/milis-kur-gui/resimler"):
			self.resim_yol = "/usr/share/milis-kur-gui/resimler"
		try:
			default_theme = Gtk.IconTheme.get_default()
			icon = default_theme.load_icon("milis-kur",64,Gtk.IconLookupFlags.FORCE_SIZE)
		except:
				icon = GdkPixbuf.Pixbuf.new_from_file("{}/milis-kur.svg".format(self.resim_yol))
		self.set_icon(icon)


		self.hb = Gtk.HeaderBar()
		self.hb.set_show_close_button(True)
		self.set_titlebar(self.hb)

		self.geri_dugme = Gtk.Button()
		self.geri_dugme.connect("clicked",self.geri_basildi)
		self.geri_dugme.set_always_show_image(True)
		self.geri_dugme.set_image(Gtk.Arrow(Gtk.ArrowType.LEFT, Gtk.ShadowType.NONE))
		self.hb.pack_start(self.geri_dugme)

		self.ileri_dugme = Gtk.Button()
		self.ileri_dugme.connect("clicked",self.ileri_basildi)
		self.ileri_dugme.set_always_show_image(True)
		self.ileri_dugme.set_image_position(Gtk.Justification.RIGHT)
		self.ileri_dugme.set_image(Gtk.Arrow(Gtk.ArrowType.RIGHT, Gtk.ShadowType.NONE))
		self.hb.pack_end(self.ileri_dugme)

		self.stack_secili = 0
		self.stack_liste = [hosgeldiniz.StHosgeldiniz(self),klavye.StKlavye(self),konum.StKonum(self),kullanici.StKullanici(self),disk_secim.DiskSecim(self),disk.StDisk(self),bilgi.StBilgi(self),kurulum.StKurulum(self),bitti.StBitti(self)]
		self.stack = Gtk.Stack()
		self.add(self.stack)
		self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT)
		self.stack.set_transition_duration(1000)
		for sta in self.stack_liste:
			self.stack.add_titled(sta, sta.ad, sta.baslik)

		####### ilk stacketi ekliyoruz ######
		self.baslik_ekle(self.stack_liste[0])
		self.geri_dugme.set_sensitive(False)
		self.dil_ata("Türkçe")

	def canli_kullanici_getir(self):
		yol = "/etc/canli_kullanici"
		if os.path.exists(yol):
			f = open(yol,"r")
			okunan = f.readlines()
			f.close()
			ilk_satir = okunan[0]
			ilk_satir = ilk_satir.replace("\n","")
			if ilk_satir != "":
				return ilk_satir
		return os.getlogin()

	def dil_ata(self,dil):
		self.set_title(diller.diller[dil]["t1"])
		self.geri_dugme.set_label(diller.diller[dil]["t2"])
		self.ileri_dugme.set_label(diller.diller[dil]["t3"])
		for sta in self.stack_liste:
			sta.dil_ata(dil)
		self.hb.props.title = self.stack_liste[self.stack_secili].baslik

	def ileri_basildi(self,widget):
		self.stack_secili += 1
		self.geri_dugme.set_sensitive(True)
		if self.stack_secili == 3:
			if self.stack_liste[self.stack_secili].kontrol() == False:
				self.stack_liste[self.stack_secili].yon_kul_ayni_gizle()
			else:
				self.ileri_dugme.set_sensitive(True)
		elif self.stack_secili == 5:
			grub_name = self.stack_liste[4].grub_combo.get_active_text()
			disk_name = self.stack_liste[4].diskler_combo.get_active_text()
			diski_sil = self.stack_liste[4].diski_sil.get_active()
			if grub_name != disk_name:
				baslik = diller.diller[self.milis_ayarlari["dil"]]["t80"]
				soru = Gtk.MessageDialog(self,0,Gtk.MessageType.INFO, Gtk.ButtonsType.OK,baslik)
				soru.set_title(diller.diller[self.milis_ayarlari["dil"]]["t80"])
				soru.format_secondary_text(diller.diller[self.milis_ayarlari["dil"]]["t81"])
				soru.run()
				soru.destroy()
			if diski_sil:
				disk_name_ = disk_name.split(" ")[0]
				baslik = diller.diller[self.milis_ayarlari["dil"]]["t86"]
				soru = Gtk.MessageDialog(self,0,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL,baslik)
				d = diller.diller[self.milis_ayarlari["dil"]]["t87"]
				if os.path.exists("/sys/firmware/efi"):
					t = "{} partition 1 vfat\n{} partition 2 ext4".format(disk_name_,disk_name_)
				else:
					t = "{} partition 1 ext4".format(disk_name_)
				soru.set_title(diller.diller[self.milis_ayarlari["dil"]]["t86"])
				soru.format_secondary_text(d.format(disk_name_,t))
				cevap = soru.run()
				if cevap == Gtk.ResponseType.OK:
					os.popen("oto-diskpart.sh {}".format(disk_name_)).read()
					self.stack_liste[4].disk_doldur(None)
					parts = self.stack_liste[4].diskler[disk_name_]["PARTITIONS"]
					parts.sort()
					if len(parts) == 1:
						e = ""
						s = "{} ext4 {} / 1".format(parts[0][0],parts[0][1])
					elif len(parts) > 1:
						e = "{} vfat {} /boot/efi 1".format(parts[0][0],parts[0][1])
						s = "{} ext4 {} / 1".format(parts[1][0],parts[1][1])
					self.milis_ayarlari["uefi_disk"] = e
					self.milis_ayarlari["sistem_disk"] = s
					self.disk_silindi = True
					self.stack_liste[6].dil_ata(self.milis_ayarlari["dil"])
					self.stack_secili += 1
				else:
					self.stack_secili -= 1
				soru.destroy()
			else:
				self.disk_silindi = False
				self.stack_liste[5].disk = disk_name
				self.stack_liste[5].disk_secildi()
				if self.milis_ayarlari["sistem_disk"] == "":
					self.ileri_dugme.set_sensitive(False)
		elif self.stack_secili == 6:
			self.stack_liste[self.stack_secili].dil_ata(self.milis_ayarlari["dil"])
		elif self.stack_secili == 7:
			self.ileri_dugme.set_sensitive(False)
			self.geri_dugme.set_sensitive(False)
		self.baslik_ekle(self.stack_liste[self.stack_secili])


	def geri_basildi(self,widget):
		self.stack_secili -= 1
		self.ileri_dugme.set_sensitive(True)
		if self.stack_secili == 0:
			self.geri_dugme.set_sensitive(False)
		elif self.stack_secili == 5 and self.disk_silindi:
			self.stack_secili -= 1
		self.baslik_ekle(self.stack_liste[self.stack_secili])

	def baslik_ekle(self,stack):
		if self.stack_secili == 7:
			baslik = diller.diller[self.milis_ayarlari["dil"]]["t73"]
			soru = Gtk.MessageDialog(self,0,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL,baslik)
			soru.set_title(diller.diller[self.milis_ayarlari["dil"]]["t73"])
			soru.format_secondary_text(diller.diller[self.milis_ayarlari["dil"]]["t45"])
			cevap = soru.run()
			if cevap == Gtk.ResponseType.OK:
				soru.destroy()
				self.hb.props.title = stack.baslik
				self.stack.set_visible_child_name(stack.ad)
				#self.stack.kurulum_baslat(self)
				yazilacak = ""
				keymap = self.milis_ayarlari['klavye_duzen'] + self.milis_ayarlari['klavye_varyant']
				yazilacak += "KEYMAP {}\n".format(keymap)
				yazilacak += "HOSTNAME {}\n".format(self.milis_ayarlari['bilgisayar_adi'])
				if self.milis_ayarlari['dil'] == "Türkçe":
					yazilacak += "LOCALE tr_TR.utf8\n"
				elif self.milis_ayarlari['dil'] == "English":
					yazilacak += "LOCALE en_US.utf8\n"
				zone = self.milis_ayarlari['konum']
				if zone == 'Europe/Istanbul':
					zone = 'Turkey'
				yazilacak += "TIMEZONE {}\n".format(zone)
				yazilacak += "ROOTPASSWORD {}\n".format(self.milis_ayarlari['yonetici_sifre'])
				yazilacak += "USERLOGIN {}\n".format(self.milis_ayarlari['giris_adi'])
				yazilacak += "USERNAME {}\n".format(self.milis_ayarlari['kullanici_adi'])
				yazilacak += "USERPASSWORD {}\n".format(self.milis_ayarlari['kullanici_sifre'])
				yazilacak += "USERGROUPS {}\n".format(self.milis_ayarlari['gruplar'])
				yazilacak += "BOOTLOADER {}\n".format(self.milis_ayarlari['grub_kur'])
				yazilacak += "TEXTCONSOLE 0\n"
				if self.milis_ayarlari["sistem_disk"] != "":
					yazilacak += "MOUNTPOINT {}\n".format(self.milis_ayarlari["sistem_disk"])
				if self.milis_ayarlari["takas_disk"] != "":
					yazilacak += "MOUNTPOINT {}\n".format(self.milis_ayarlari["takas_disk"])
				if self.milis_ayarlari["uefi_disk"] != "":
					yazilacak += "MOUNTPOINT {}\n".format(self.milis_ayarlari["uefi_disk"])
				f = open("/tmp/milis_kur_ayar.txt","w")
				f.write(yazilacak)
				f.close()
				f = open("/tmp/milis_kurulum_baslat.sh","w")
				f.write("/usr/milis/bin/milis-kur /tmp/milis_kur_ayar.txt text")
				f.close()
				self.ileri_dugme.set_sensitive(False)
				self.geri_dugme.set_sensitive(False)
				stack.terminal.komut_calistir()
			else:
				self.stack_secili = 5
				soru.destroy()
		else:
			self.hb.props.title = stack.baslik
			self.stack.set_visible_child_name(stack.ad)

if __name__ == '__main__':
	pen = MerkezPencere()
	pen.connect("destroy", Gtk.main_quit)
	pen.show_all()
	Gtk.main()
